package com.tianyadu.multi_module_demo.controller.config;

import com.tianyadu.multi_module_demo.domain.User;
import com.tianyadu.multi_module_demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Flux;

import java.util.Collection;

/**
 * @FileName: RouterFunctionConfiguration
 * @Description: 路由器函数
 * @author: xueyj
 * @create: 2018-11-17 10:36
 */
@Configuration
public class RouterFunctionConfiguration {

    /**
     Servlet
     请求接口：ServlerRequest 或者 HttpServlerRequest
     响应接口：ServlerResponse 或者 HttpServlerResponse

     spring5.0 重新定义了服务请求/响应接口
     请求接口：ServerRequest
     响应接口: ServerResponse
     即可支持Servlet规范，也支持自定义规范，比如Netty（Web server）
     本示例，GET请求，返回所有对象，URL：/user/find/all
     Flux 0--N个对象集合
     Mono 0--1个对象集合
     Reactive 中的 Flux 或者 Mono 是异步处理（非阻塞）
     集合对象通常是同步处理（阻塞）
     Flux/Mono 都是Publisher(发布者，即发布器，推送信息)
     */
    @Bean
    @Autowired
    public RouterFunction<ServerResponse> findAll(UserRepository userRepository) {

        //  构建方法请求信息
        return RouterFunctions.route(RequestPredicates.GET("/user/find/all"),
                serverRequest -> {
                    //  获取所有用户信息
                    Collection<User> users = userRepository.findAll();
                    //  Mono<ServerResponse> responseMono = null;
                    // 将用户信息迭代至Flux发布器中
                    Flux<User> userFlux = Flux.fromIterable(users);
                    //  返回请求信息（Flux发布信息，发布内容来源）
                    return  ServerResponse.ok().body(userFlux, User.class);
                });
    }
}